package com.example.springbootzklock.service;

import com.example.springbootzklock.lock.Lock;
import com.example.springbootzklock.lock.ZkTemplateLockImpl;


/**
 * @Description: 使用分布式锁获取订单编号
 * @Author: mingtian
 * @CreateDate: 2019/9/24 20:33
 * @Version: 1.0
 */
public class OrderServiceZkLock implements Runnable {

    /**
     * 定义锁
     */
    private Lock lock = new ZkTemplateLockImpl();

    private OrderNumberGenerator orderNumberGenerator = new OrderNumberGenerator();

    @Override
    public void run() {
        getNumber();
    }

    /**
     * 生成订单号  使用 分布式锁 解决
     */
    private void getNumber() {
        try {
            //获取锁
            lock.getLock();
            Thread.sleep(100);
            //生成订单号
            String number = orderNumberGenerator.getNumber();
            System.out.println(Thread.currentThread().getName() + ",订单号=" + number);

            // 如果 zk 超时了，有数据库进行了写的操作 需要进行数据回滚
        } catch (Exception e) {

        } finally {
            //释放锁
            lock.unLock();
        }
    }

}